#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// 守护进程类
class deamon
{
public:
    static deamon &get_instance()
    {
        static deamon dm;
        return dm;
    }
    // 开始守护进程化
    void deamon_start()
    {
        //1. 忽略掉管道文件带来的异常
        signal(SIGPIPE,SIG_IGN);
        //2. 守护进程不能是进程组组长，利用子进程拷贝父进程的特性，让父进程退出，子进程作为孤儿进程
        if(fork() > 0) exit(0);
        setsid();
        //3. 0、1、2重定向到黑洞
        int fd = open("/dev/null",O_RDWR);
        if(fd > 0)
        {
            dup2(fd,0);
            dup2(fd,1);
            dup2(fd,2);
            close(fd);
        }
        else
        {
            close(0);
            close(1);
            close(2);
        }
    }

    deamon(const deamon &dm) = delete;
    deamon &operator=(const deamon &dm) = delete;
protected:
    deamon() = default;
};